package main

import (
	"fmt"
	"reflect"
)

type Person struct {
	name   string
	age    int
	gender string
}

func (p Person) SayBye() {
	fmt.Println("Bye")
}

func (p Person) SayHello() {
	fmt.Println("Hello")
}

func main() {
	p := Person{"堂吉诃德·多弗朗明哥", 27, "male"}
	v := reflect.ValueOf(p)

	fmt.Println("字段数:", v.NumField())
	fmt.Println("第 1 个字段：", v.Field(0))
	fmt.Println("第 2 个字段：", v.Field(1))
	fmt.Println("第 3 个字段：", v.Field(2))

	fmt.Println("==========================")
	// 也可以这样来遍历
	for i := 0; i < v.NumField(); i++ {
		fmt.Printf("第 %d 个字段：%v \n", i+1, v.Field(i))
	}

	t := reflect.TypeOf(p)

	fmt.Println("方法数（可导出的）:", t.NumMethod())
	fmt.Println("第 1 个方法：", t.Method(0).Name)
	fmt.Println("第 2 个方法：", t.Method(1).Name)

	fmt.Println("==========================")
	// 也可以这样来遍历
	for i := 0; i < t.NumMethod(); i++ {
		fmt.Printf("第 %d 个方法：%v \n", i+1, t.Method(i).Name)
	}
}
